package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import co.gov.medellin.ssti.sub.common.util.Utility;
import co.gov.medellin.ssti.sub.model.service.AtributosService;
import co.gov.medellin.ssti.sub.model.service.BOTEmpresaService;
import co.gov.medellin.ssti.sub.model.service.BeneficiarioService;
import co.gov.medellin.ssti.sub.model.service.BeneficioService;
import co.gov.medellin.ssti.sub.model.service.EmpresaService;
import co.gov.medellin.ssti.sub.model.service.ModificarBOTService;
import co.gov.medellin.ssti.sub.model.service.RenovarService;
import co.gov.medellin.ssti.sub.model.service.SedeService;
import co.gov.medellin.ssti.sub.model.service.SubprogramaService;
import co.gov.medellin.ssti.sub.model.vo.AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.EmpresaVO;
import co.gov.medellin.ssti.sub.model.vo.ModificarBOTVO;
import co.gov.medellin.ssti.sub.model.vo.SedeVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;
import co.gov.medellin.ssti.sub.web.form.IngresoDatosBeneficiosEmpresaForm;

@Component
public class ValidarRenovarBOTEmpresaAction extends Action {
	@Autowired
	EmpresaService empresaServiceImpl;
	@Autowired
	AtributosService atributosServiceImpl2;
	@Autowired
	BeneficiarioService beneficiarioServiceImpl2;
	@Autowired
	BeneficioService beneficioServiceImpl2;
	@Autowired
	BOTEmpresaService botEmpresaServiceImpl;
	@Autowired
	ModificarBOTService modificarBOTServiceImpl2;
	@Autowired
	RenovarService renovarServiceImpl2;
	@Autowired
	SedeService sedeServiceImpl2;
	@Autowired
	SubprogramaService subprogramaServiceImpl2;

	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 * @return
	 * @throws java.io.IOException
	 * @throws javax.servlet.ServletException
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		IngresoDatosBeneficiosEmpresaForm formBean = (IngresoDatosBeneficiosEmpresaForm) form;

		HttpSession session = request.getSession();

		SubprogramaVO codigosub = new SubprogramaVO();

		String strCodigoSubpro = request.getParameter("codigoBeneficio");
		formBean.setCodigoSubprograma(strCodigoSubpro);
		// formBean.setCodigoBeneficio(strCodigoSubpro);
		codigosub.setCode(Long.valueOf(strCodigoSubpro));

		// Proceso para la auditoria
		// String terminalAddress = request.getRemoteAddr();
		Calendar c = Calendar.getInstance();

		UserVO user = (UserVO) session.getAttribute("userInfo");

		Collection<AtributoVO> atributos = null;
		Collection<SedeVO> cSedes = null;

		String codigoEmpresaStr = request.getParameter("codigoEmpresa");
		EmpresaVO empresaVO = empresaServiceImpl.findEmpresaByCodigo(Long
				.valueOf(codigoEmpresaStr));
		formBean.setCodigoEmpresa(codigoEmpresaStr);
		formBean.setEmpresaVO(empresaVO);

		SubprogramaVO subprograma = subprogramaServiceImpl2
				.findSubprogramaByCodigo(Long.valueOf(strCodigoSubpro));
		formBean.setNombreSubprograma(subprograma.getNombre());
		// formBean.getBot().setNombreSubprograma(subprograma.getNombre());
		atributos = atributosServiceImpl2.findAtributosSubprograma(
				Long.valueOf(strCodigoSubpro), "A", 0);

		// formBean.setAtributos(atributos);
		formBean.setListaAtributos(atributos);

		cSedes = sedeServiceImpl2.findTotalSedebyUser(user.getCode(), new Long(
				strCodigoSubpro), user.getUserGroupName(), user.getCodeArea());

		if (cSedes != null) {
			if (!cSedes.isEmpty()) {
				formBean.setSedes(cSedes);
			}
		}

		// proceso que traer el resto de la informacion
		List<AtributoVO> latributos = (List<AtributoVO>) renovarServiceImpl2
				.findAtributosSubpro(new Long(strCodigoSubpro));
		List<ModificarBOTVO> lResultados = new ArrayList<ModificarBOTVO>();
		// List<String> lBotSede = (List<String>) renovarServiceImpl2
		// .findBeneficioOtorgadoEmpresa(new Long(strCodigoSubpro),
		// Long.valueOf(codigoEmpresaStr));
		Long codeUltimoBOT = botEmpresaServiceImpl.findUltimoCodeBOTBySbpr(
				Long.valueOf(strCodigoSubpro), Long.valueOf(codigoEmpresaStr));
		// formBean.setCodigoSede(codigoSede);

		for (int i = 0; i < latributos.size(); i++) {
			AtributoVO atrivo = new AtributoVO();
			atrivo = (AtributoVO) latributos.get(i);
			if (atrivo.getTipoatributo().equals("R")) {
				String strValor = renovarServiceImpl2.findBeneficiarioAtri(
						atrivo.getTipodato(), Long.valueOf(codigoEmpresaStr),
						new Long(atrivo.getCodatributo()));
				ModificarBOTVO renovarvo = new ModificarBOTVO();
				if (strValor != null && !strValor.equals("")) {
					renovarvo.setNombre(atrivo.getNombre());
					renovarvo.setValorInicial(strValor);
					renovarvo.setTipoatributo(atrivo.getTipoatributo());
					lResultados.add(renovarvo);
					renovarvo = null;
				} else {
					renovarvo.setNombre(atrivo.getNombre());
					renovarvo.setValorInicial("");
					renovarvo.setTipoatributo(atrivo.getTipoatributo());
					lResultados.add(renovarvo);
					renovarvo = null;
				}
			} else {
				if (codeUltimoBOT != null) {

					// RenovarVO renovarvo = renovarServiceImpl2
					// .findBeneficioAtri(atrivo.getTipodato(),
					// codeUltimoBOT,
					// new Long(atrivo.getCodatributo()));
					String valor = botEmpresaServiceImpl.findValorBOTAtr(
							atrivo.getTipodato(), codeUltimoBOT,
							Long.valueOf(atrivo.getCodatributo()));
					if (valor != null) {
						ModificarBOTVO vo = new ModificarBOTVO();
						vo.setNombre(atrivo.getNombre());
						vo.setValorInicial(valor);
						vo.setTipoatributo(atrivo.getTipoatributo());
						lResultados.add(vo);
					} else {
						ModificarBOTVO vo = new ModificarBOTVO();
						vo.setNombre(atrivo.getNombre());
						vo.setValorInicial("");
						vo.setTipoatributo(atrivo.getTipoatributo());
						lResultados.add(vo);
					}
				}
			}
		}
		// formBean.setResultados(lResultados);
		// formBean.set
		// fin del proceso

		// Proceso para obtener el valor del beneficio
		String strCostBene = beneficioServiceImpl2.findCostoBeneficio(new Long(
				strCodigoSubpro));
		if (strCostBene != null) {
			formBean.getBot().setValorBeneficio(Long.valueOf(strCostBene));
			formBean.getSubprogramaVO().setValorUnitarioBeneficio(strCostBene);
		}

		SimpleDateFormat dateFormat2 = new SimpleDateFormat("dd/MM/yyyy");
		String strDate = dateFormat2.format(c.getTime());
		// formBean.getBot().setFechaBeneficio(strDate);
		formBean.setFecha(strDate);
		// Fin del proceso
		// Hace click en el boton Continuar.
		System.out.println("operacion:" + formBean.getOperacion());
		System.out.println("request.operacion:"
				+ request.getParameter("operacion") + "/"
				+ request.getAttribute("operacion"));
		if (formBean.getOperacion().equals(Utility.OP_GUARDAR)) {
			ActionForward actionRedirect = new ActionForward(mapping
					.findForward("ir").getName(), mapping.findForward("ir")
					.getPath()
					+ "?codigoEmpresa="
					+ codigoEmpresaStr
					+ "&codigoSubprograma=" + strCodigoSubpro, true);
			return actionRedirect;
		}
		return mapping.findForward("success");

	}
}
